#!/usr/bin/env python
# split-cmdline - Split swift compiler command lines ------------*- python -*-
#
# This source file is part of the Swift.org open source project
#
# Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
# Licensed under Apache License v2.0 with Runtime Library Exception
#
# See https://swift.org/LICENSE.txt for license information
# See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
#
# ----------------------------------------------------------------------------
#
# Split swift compiler command lines into multiple lines.
#
# Reads the command line from stdin an outputs the split line to stdout.
# Example:
#
# $ swiftc -c hello.swift -### | split-cmdline
# /path-to-swift/bin/swift \
#   -frontend \
#   -c \
#   -primary-file hello.swift \
#   -target x86_64-apple-macosx10.9 \
#   -enable-objc-interop \
#   -color-diagnostics \
#   -module-name hello \
#   -o hello.o
#
# Example usage in vim:
# *) make sure that split-cmdline is in the $PATH
# *) copy-paste the swift command line the text buffer
# *) select the command line
# *) go to the command prompt (= press ':')
# :'<,'>!split-cmdline
#
# ----------------------------------------------------------------------------

from __future__ import print_function

import os
import re
import shlex
import sys


def main():
    for line in sys.stdin:
        first = True
        is_arg_param = False
        # Handle escaped spaces
        args = shlex.split(line)
        for arg in args:
            if arg == "":
                continue
            if not first:
                # Print option arguments in the same line
                print(" " if is_arg_param else " \\\n  ", end="")
            first = False

            # Expand @ option files
            m = re.match(r"^@(\S+\.txt)$", arg)
            if m:
                cmd_file = m.group(1)
                if os.path.isfile(cmd_file):
                    with open(cmd_file) as f:
                        for ln in f.readlines():
                            for name in ln.rstrip().split(";"):
                                if name != "":
                                    print(name + " \\")
                first = True
                continue

            if " " in arg:
                print('"' + arg + '"', end="")
            else:
                print(arg, end="")

            # A hard-coded list of options which expect a parameter
            is_arg_param = arg in [
                "-o",
                "-target",
                "-isysroot",
                "-emit-sil",
                "-emit-ir",
                "-module-name",
                "-framework",
                "-Xlinker",
                "-arch",
                "-D",
                "-sdk",
                "-module-cache-path",
                "-F",
                "-output-file-map",
                "-emit-module-path",
                "-Xcc",
                "-I",
                "-iquote",
                "-emit-objc-header-path",
                "-Xfrontend",
                "-filelist",
                "-num-threads",
                "-Xclang",
                "-x",
                "-L",
                "-rpath",
                "-macosx_version_min",
                "-syslibroot",
                "-add_ast_path",
                "-import-objc-header",
                "-serialize-diagnostics-path",
                "-emit-dependencies-path",
                "-emit-reference-dependencies-path",
                "-primary-file",
                "-resource-dir",
                "--sdk",
                "--toolchain",
                "-emit-module-doc-path",
                "-module-link-name",
                "-group-info-path",
                "-fileno",
                "-swift-version",
                "-Xllvm",
            ]

        # Print 2 new lines after each command line
        print("\n")


if __name__ == "__main__":
    main()
